import re

"""
    如果想从字符串中提取一部分内容，该怎么办呢？
    使用括号 () 将想提取的子字符串括起来。() 实际上标记了一个子表达式的开始和结束位置，被标记的每个子表达式会依次对应每一个分组，调用 group 方法传入分组的索引即可获取提取的结果
"""

# 示例 1 匹配目标
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
print(result.group()) # Hello 1234567 World
print(result.group(1)) # 1234567
print(result.span()) # (0, 19)


"""
 通用匹配
 刚才我们写的正则表达式其实比较复杂，出现空白字符我们就写 \s 匹配，出现数字我们就用 \d 匹配，这样的工作量非常大。其实完全没必要这么做，
 因为还有一个万能匹配可以用，那就是 .*。其中 . 可以匹配任意字符（除换行符），* 代表匹配前面的字符无限次，所以它们组合在一起就可以匹配任意字符了。有了它，我们就不用挨个字符匹配了。
"""

# 示例2 通用匹配 .* 除换行外0个或多个任意字符
content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello.*Demo$',content)
print(result)
print(result.group()) # Hello 123 4567 World_This is a Regex Demo
print(result.span()) # (0,41)


# 示例3 通用匹配默认就是贪婪模式，有时候匹配出现缺失
"""
  贪婪模式:  就是尽可能的匹配多个字符
  如下示例: He.* 尽可能多的匹配，那么匹配到123456，然后\d+ 是一个或多个数值，也就是匹配到7
"""
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(\d+).*Demo$', content)
print(result)
print(result.group()) # Hello 1234567 World_This is a Regex Demo
print(result.group(1)) # 7
print(result.span()) # (0, 40)


# 示例4 通用匹配-非贪婪模式
"""
    非贪婪模式:  就是尽量匹配少的字符，使用?
    如下示例: ^He.*? 尽量匹配少的字符，那么匹配搭配llo和空格， 1234567 都被\d+匹配到
"""
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result)
print(result.group()) # Hello 1234567 World_This is a Regex Demo
print(result.group(1)) # 1234567
print(result.span()) # (0, 40)


"""
 综合示例3、4 得出结论:  在做匹配的时候，字符串中间尽量使用非贪婪匹配，也就是用 .*? 来代替 .*，以免出现匹配结果缺失的情况
 需要注意，如果匹配的结果在字符串结尾，.*? 就有可能匹配不到任何内容了，因为它会匹配尽可能少的字符
"""

# 示例5 通用匹配-非贪婪模式，在结尾导致数据缺失
content = 'http://weibo.com/comment/kEraCN'
result1 = re.match('http.*?comment/(.*?)', content)
result2 = re.match('http.*?comment/(.*)', content)
print('result1', result1.group(1)) # result1    没有匹配到需要的数据
print('result2', result2.group(1)) # result2 kEraCN





